package com.hb.trade.server.project.util;

import cn.hutool.core.io.FileUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.hb.trade.server.project.config.TokenHolder;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * 文本转音频文件工具类
 *
 * @author Lix1ang
 * @date 2022-1-19 09:37:59
 */
@Component
public class TextToAudioUtil {

    //会场纪律文本
    private static final String disciplineText = "开标会议纪律。1、参加会议的人员要统一服从管理，遵守会场纪律，维护会场秩序，不得随意进出会场，进入会场应将各类通讯工具关闭或调至静音状态，禁止手机拍照，保持会场安静。2、参会人员要服从会议统一安排，会议进行时不得大声喧哗，不得随意走动，不得扰乱会场秩序，不得中途无故退出会场。3、除采购人和相关人员外，其他单位和人员应退出会场，所有与会人员要严格遵守工作纪律，不得泄露谈判内容及其他有关情况。";

    //private static final String appKey = "mBUUpBAsEDuIhFC1PmE4yg8t";
    private static final String appKey = SpringUtil.getProperty("ocr.appKey");

    //private static final String secretKey = "L8szE7UjHfpo6hjadLOHhuHKwDTkthPo";
    private static final String secretKey = SpringUtil.getProperty("ocr.secretKey");


    //发音人选择, 基础音库：0为度小美，1为度小宇，3为度逍遥，4为度丫丫，
    //精品音库：5为度小娇，103为度米朵，106为度博文，110为度小童，111为度小萌，默认为度小美
    private static final int per = 3;
    //语速，取值0-15，默认为5中语速
    private static final int spd = 5;
    //音调，取值0-15，默认为5中语调
    private static final int pit = 5;
    //音量，取值0-9，默认为5中音量
    private static final int vol = 5;

    private static String cuid = "1234567JAVA";

    //下载的文件格式, 3：mp3(default) 4： pcm-16k 5： pcm-8k 6. wav
    private static final int aue = 3;

    private static final String url = "http://tsn.baidu.com/text2audio";

    static {
        //判断会场纪律音频文件是否存在，如果不存在则生成
        File file = new File("hall_audio/discipline.mp3");
        if (!file.exists()) {
            try {
                convert(disciplineText, "discipline");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static String convert(String text, String fileName) throws IOException {
        TokenHolder holder = new TokenHolder(appKey, secretKey, TokenHolder.ASR_SCOPE);
        holder.refresh();
        String token = holder.getToken();

        // 此处2次urlencode， 确保特殊字符被正确编码
        String params = "tex=" + ConnUtil.urlEncode(ConnUtil.urlEncode(text));
        params += "&per=" + per;
        params += "&spd=" + spd;
        params += "&pit=" + pit;
        params += "&vol=" + vol;
        params += "&cuid=" + cuid;
        params += "&tok=" + token;
        params += "&aue=" + aue;
        params += "&lan=zh&ctp=1";
        System.out.println(url + "?" + params); // 反馈请带上此url，浏览器上可以测试
        HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setConnectTimeout(5000);
        PrintWriter printWriter = new PrintWriter(conn.getOutputStream());
        printWriter.write(params);
        printWriter.close();
        String contentType = conn.getContentType();
        if (contentType.contains("audio/")) {
            byte[] bytes = ConnUtil.getResponseBytes(conn);
            String format = getFormat(aue);
            //创建文件
            File newFile = new File("hall_audio/" + fileName + "." + format);
            File file = FileUtil.touch(newFile);
            // System.out.println( file.getAbsolutePath());
            FileOutputStream os = new FileOutputStream(file);
            os.write(bytes);
            os.close();
            /*String speechUrl = OssUtil.uploadTrading(file);
            file.delete();*/
            return fileName + "." + format;
        } else {
            System.err.println("ERROR: content-type= " + contentType);
            String res = ConnUtil.getResponseString(conn);
            System.err.println(res);
            return res;
        }
    }

    // 下载的文件格式, 3：mp3(default) 4： pcm-16k 5： pcm-8k 6. wav
    private static String getFormat(int aue) {
        String[] formats = {"mp3", "pcm", "pcm", "wav"};
        return formats[aue - 3];
    }
}
